package geektime.io.nio2.demo;

import java.io.IOException;
import java.nio.file.*;

import static java.nio.file.StandardWatchEventKinds.*;

/**
 * 模拟文件监控服务
 */
public class WatchServiceExample {

    public static void main(String[] args) throws IOException {
        // 获取一个监控路径。如果已经配置了这个路径，那么就用这个路径
        String watchDir = System.getProperty("java.io.tmpdir");
        if (args.length >= 1) {
            watchDir = args[0];
        }
        FileSystem dfFileSystem = FileSystems.getDefault();
        Path watchPath = dfFileSystem.getPath(watchDir);
        // 构建一个watchServer，并注册监听的事件
        WatchService ws = dfFileSystem.newWatchService();
        watchPath.register(ws, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
        // 循环打印监听结果
        for(;;) {
            WatchKey key;
            try {
                key = ws.take();
            } catch (InterruptedException e) {
                e.printStackTrace();
                return;
            }
            // 循环打印事件
            for (WatchEvent<?> event : key.pollEvents()) {
                WatchEvent.Kind<?> kind = event.kind();
                if (kind == OVERFLOW) {
                    System.out.println("overflow");
                    continue;
                }
                // 打印事件发生的路径和事件的名称
                Path path = (Path)event.context();
                System.out.printf("%s - %s\n", path.toAbsolutePath(), event.kind());
            }
            boolean valid = key.reset();
            if (!valid) break;
        }
    }
}
